package org.example.config;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

//service方法进行统一处理（增强）：方法执行前记录当前时间
//定义为bean组件及切面
@Aspect
@Component
public class LogCurrentTimeAspect {

    //定义切点：匹配方法的规则是，org.example.service包下任意类，以select开头的方法
    @Pointcut("execution(* org.example.service.*.select*(..))")
    public void pointcut(){}

    //定义通知：定义增强的时间及逻辑，并指定切点
    //前置通知
    @Before("pointcut()")
    public void before(){
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:sss");
        System.out.println("当前时间为：" + df.format(new Date()));
    }

    //后置通知
    @After("pointcut()")
    public void after(){
        System.out.println("@After后置通知");
    }

    //返回前通知
    @AfterReturning("pointcut()")
    public void afterReturning(){
        System.out.println("@AfterReturning返回前通知");
    }

    //抛异常通知
    @AfterThrowing("pointcut()")
    public void afterThrowing(){
        System.out.println("@AfterThrowing抛异常通知");
    }

    //环绕通知：方法执行前和执行后，按方法体中的逻辑执行
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //统计执行时间
        //前置逻辑
        long start = System.currentTimeMillis();
        //joinPoint.proceed()其实就是目标方法被调用
        Object o = joinPoint.proceed();
        //后置逻辑
        long end = System.currentTimeMillis();
        System.out.println("@Around环绕通知，计算的执行时间："+(end-start)+"毫秒");
        return o;
    }
}